package com.trello.rxlifecycle; import rx.Observable; import rx.functions.Func1; import rx.functions.Func2; import javax.annotation.Nonnull; final class TakeUntilGenerator { @Nonnull static <T> Observable<T> takeUntilEvent(@Nonnull final Observable<T> lifecycle, @Nonnull final T event) { return lifecycle.takeFirst(new Func1<T, Boolean>() { @Override public Boolean call(T lifecycleEvent) { return lifecycleEvent.equals(event); } }); } @Nonnull static <T> Observable<Boolean> takeUntilCorrespondingEvent(@Nonnull final Observable<T> lifecycle, @Nonnull final Func1<T, T> correspondingEvents) { return Observable.combineLatest( lifecycle.take(1).map(correspondingEvents), lifecycle.skip(1), new Func2<T, T, Boolean>() { @Override public Boolean call(T bindUntilEvent, T lifecycleEvent) { return lifecycleEvent.equals(bindUntilEvent); } }) .onErrorReturn(Functions.RESUME_FUNCTION) .takeFirst(Functions.SHOULD_COMPLETE); } private TakeUntilGenerator() { throw new AssertionError("No instances!"); } }